package com.jason.fontmetrics.view;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.EmbossMaskFilter;
import android.graphics.Paint;
import android.graphics.PointF;
import android.util.AttributeSet;
import android.view.View;

/**
 * 爱哥博客地址 http://blog.csdn.net/aigestudio/article/details/41447349
 * @DESC: EmbossMaskFilter
 * @Author: Jason
 * @Date: 16/8/29
 * @Time: 23:02
 *
 * 的常用性比较低，倒不是说EmbossMaskFilter很没用，
 * 只是相对于EmbossMaskFilter实现的效果来说远不及BlurMaskFilter给人的感觉霸气，
 * 说了半天那么EmbossMaskFilter到底是做什么的呢？
 *
 * 这么一个看着像巧克力的东西就是用EmbossMaskFilter实现了，正如其名，他可以实现一种类似浮雕的效果，
 * 说白了就是让你绘制的图像感觉像是从屏幕中“凸”起来更有立体感一样（在设计软件中类似的效果称之为斜面浮雕）
 *
 * 该类也只有一个含参的构造方法EmbossMaskFilter(float[] direction, float ambient, float specular, float blurRadius)，
 * 这些参数理解起来要比BlurMaskFilter困难得多，如果你没有空间想象力的话，首先我们来看第一个direction指的是方向，什么方向呢？
 * 光照的方向！如果大家接触过三维设计就一定懂，没接触也没关系，我跟你说明白。假设一个没有任何光线的黑屋子里有一张桌子，
 * 桌子上有一个小球，这时我们打开桌子上的台灯，台灯照亮了小球，这时候小球的状态与下图类似：
 *
 *
 * 小球最接近光源的地方肯定是最亮的这个没有异议，在参数中specular就是跟高光有关的，
 * 其值是个双向值越小或越大高光越强中间值则是最弱的，那么再看看什么是ambient呢？同样我们看个球，
 * 你会发现即便只有一盏灯光，在球底部跟桌面相接的地方依然不会出现大片的“死黑”，
 * 这是因为光线在传播的过程中碰到物体会产生反射！这种反射按照物体介质的粗糙度可以分为漫反射和镜面反射，
 * 而这里我们的小球之所以背面没有直接光照但仍能有一定的亮度就是因为大量的漫反射在空间传播让光线间接照射到小球背面，
 * 这种区别于直接照明的二次照明我们称之为间接照明，产生的光线叫做环境光ambient，参数中的该值就是用来设置环境光的，
 * 在Android中环境光默认为白色，其值越大，阴影越浅，blurRadius则是设置图像究竟“凸”出多大距离的很好理解，
 * 最难理解的一个参数是direction，上面我们也说了是光照方向的意思，该数组必须要有而且只能有三个值即float[x,y,z]，
 * 这三个值代表了一个空间坐标系，我们的光照方向则由其定义，那么它是怎么定义的呢？首先x和y很好理解，平面的两个维度嘛是吧，
 * 上面我们使用的是[1,1]也就是个45度角，而z轴表示光源是在屏幕后方还是屏幕前方，上面我们是用的是1，正值表示光源往屏幕外偏移1个单位，
 * 负值表示往屏幕里面偏移，这么一说如果我把其值改为[1,1,-1]那么我们的巧克力朝着我们的一面应该就看不到了对吧，
 * 试试看撒~~~这个效果我就不截图了，因为一片漆黑……但是你依然能够看到一点点灰度~就是因为我们的环境光ambient！，
 * 如果我们把值改为[1,1,2]往屏幕外偏移两个单位，那么我们巧克力正面光照将更强：
 *
 * 看吧都爆色了！这里要提醒一点[x,y,z]表示的是空间坐标，代表光源的位置，
 * 那么一旦这个位置确定，[ax,ay,az]则没有意义，
 * 也就是说同时扩大三个轴向值的倍数是没有意义的，最终效果还是跟[x,y,z]一样！懂了不？
 *
 */

public class EmbossMaskFilterView6 extends View {

    private static final int H_COUNT = 2, V_COUNT = 4; // 水平和垂直切割数
    private Paint mPaint;
    private PointF[] mPointFs; // 存储各个巧克力左上坐标点的位置
    private int width,height; // 单个巧克力的宽高
    private float coorY; // 单个巧克力左上Y轴坐标值


    public EmbossMaskFilterView6(Context context) {
        this(context, null);
    }

    public EmbossMaskFilterView6(Context context, AttributeSet attrs) {
        super(context, attrs);

        // 不使用硬件加速
        setLayerType(LAYER_TYPE_SOFTWARE, null);
        initPaint();
        // 计算参数
        cal();
    }

    private void cal() {
        width = getResources().getDisplayMetrics().widthPixels / H_COUNT;
        height = getResources().getDisplayMetrics().heightPixels / V_COUNT;

        int count = V_COUNT * H_COUNT;

        mPointFs = new PointF[count];
        for (int i = 0; i < count; i++) {
            if (i % 2 == 0) {
                coorY = i * height / 2F;
                mPointFs[i] = new PointF(0, coorY);
            } else {
                mPointFs[i] = new PointF(width, coorY);
            }
        }

    }

    private void initPaint() {
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
        mPaint.setStyle(Paint.Style.FILL);
        mPaint.setColor(0xFF603811);

        // 设置画笔遮罩滤镜
        mPaint.setMaskFilter(new EmbossMaskFilter(new float[]{1, 1, 1F}, 0.1F, 10F, 20F));
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawColor(Color.GRAY);

        // 画矩形
        for (int i = 0; i < V_COUNT * H_COUNT; i++) {
            canvas.drawRect(mPointFs[i].x, mPointFs[i].y, mPointFs[i].x + width, mPointFs[i].y + height, mPaint);
        }
    }
}
